package com.sise.BitOperation;

/**
 *      136. 只出现一次的数字
 *      给定一个非空整数数组，除了某个元素只出现一次以外，其余每个元素均出现两次。找出那个只出现了一次的元素。
 *
 *      要求：不使用额外的空间
 *      输入: [4,1,2,1,2]
 *      输出: 4
 *
 *
 *      位运算：
 *          1、按位与运算符（&）
 *              参加运算的两个数据，按二进制位进行“与”运算。
 *              运算规则： 0&0=0;  0&1=0;   1&0=0;    1&1=1;
 *
 *          2、按位或运算符（|）
 *              参加运算的两个对象，按二进制位进行“或”运算。
 *              运算规则：0|0=0；  0|1=1；  1|0=1；   1|1=1；
 *
 *          3、取反运算符 （~）
 *          参加运算的一个数据，按二进制位进行“取反”运算。
 *          运算规则：~1=0；  ~0=1；
 *
 *          4、异或运算符 （^）
 *          用于比较两个二进制数的相应位。在执行按位异或运算时，如果两个二进制数的相应位都为 1 或两个二进制数的相应位都位 0，则返回 0；
 *          如果两个二进制数的相应位其中一个为 1，另一个为 0，则返回 1；
 *
 *          任何数和 0 做异或运算，结果仍然是原来的数，即 a⊕0=a
 *          任何数和其自身做异或运算，结果是 0，即 a⊕a=0
 *          异或运算满足交换律和结合律，即 a⊕b⊕a =b⊕a⊕a = b⊕(a⊕a)= b⊕0 = b
 *
 *          5、位移运算符（ << ）和（ >> ）
 *
 *          6、条件运算符（ ? ：） 又叫三元运算符
 *
 */
public class BitOperation {

    public static void main(String[] args) {
        System.out.println(true || false);      // 只要有一个为 true，则返回 true
    }

    public int singleNumber(int[] nums) {
        int single = 0;
        for (int num : nums){
            single ^= num;
        }
        return single;
    }
}
